TypeScript์ 'using' ์ ์ธ์ ํตํ ๊ฒฐ์ ์ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ํ์ํ์ฌ ํจ์จ์ ์ด๊ณ ์์ ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๋์์ ๋ณด์ฅํฉ๋๋ค. ์ค์ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํตํด ๋ฐฐ์ฐ์ธ์.
TypeScript Using ์ ์ธ: ๊ฐ๋ ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ํ๋์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ
ํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ํจ์จ์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ ๊ฐ๋ ฅํ๊ณ ์ ๋ขฐํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ฆฌ์์ค ๋์๋ ์ฑ๋ฅ ์ ํ, ๋ถ์์ ์ฑ, ์ฌ์ง์ด ์ถฉ๋๋ก ์ด์ด์ง ์ ์์ต๋๋ค. TypeScript๋ ๊ฐ๋ ฅํ ํ์ดํ๊ณผ ํ๋์ ์ธ ์ธ์ด ๊ธฐ๋ฅ์ ํตํด ๋ฆฌ์์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ์ฌ๋ฌ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด ์ค using
์ ์ธ์ ๊ฒฐ์ ์ ๋ฆฌ์์ค ํด์ ๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ก, ์ค๋ฅ ๋ฐ์ ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ฆฌ์์ค๊ฐ ์ ์ํ๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ํด์ ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
'Using' ์ ์ธ์ด๋ ๋ฌด์์ธ๊ฐ?
์ต์ ๋ฒ์ ์ ๋์
๋ TypeScript์ using
์ ์ธ์ ๋ฆฌ์์ค์ ๊ฒฐ์ ์ ์ข
๋ฃ๋ฅผ ์ ๊ณตํ๋ ์ธ์ด ๊ตฌ๋ฌธ์
๋๋ค. ์ด๋ ๊ฐ๋
์ ์ผ๋ก C#์ using
๋ฌธ์ด๋ Java์ try-with-resources
๋ฌธ๊ณผ ์ ์ฌํฉ๋๋ค. ํต์ฌ ์์ด๋์ด๋ using
์ผ๋ก ์ ์ธ๋ ๋ณ์๋ ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ณ์๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ [Symbol.dispose]()
๋ฉ์๋๊ฐ ์๋์ผ๋ก ํธ์ถ๋๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ํตํด ๋ฆฌ์์ค๊ฐ ์ ์ํ๊ณ ์ผ๊ด๋๊ฒ ํด์ ๋ฉ๋๋ค.
๋ณธ์ง์ ์ผ๋ก using
์ ์ธ์ IDisposable
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ (๋๋ ๋ ์ ํํ๊ฒ๋ [Symbol.dispose]()
๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง) ๋ชจ๋ ๊ฐ์ฒด์ ํจ๊ป ์๋ํฉ๋๋ค. ์ด ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด๊ฐ ๋ณด์ ํ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๋ ์ญํ ์ ํ๋ ๋จ์ผ ๋ฉ์๋ [Symbol.dispose]()
๋ฅผ ์ ์ํฉ๋๋ค. using
๋ธ๋ก์ด ์ ์์ ์ผ๋ก ๋๋ ์์ธ๋ก ์ธํด ์ข
๋ฃ๋ ๋ [Symbol.dispose]()
๋ฉ์๋๊ฐ ์๋์ผ๋ก ํธ์ถ๋ฉ๋๋ค.
'Using' ์ ์ธ์ ์ฌ์ฉํ๋ ์ด์
๊ฐ๋น์ง ์ปฌ๋ ์
์ ์์กดํ๊ฑฐ๋ ์๋ try...finally
๋ธ๋ก์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ ํต์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ ๊ธฐ๋ฒ์ ํน์ ์ํฉ์์ ์ด์์ ์ด์ง ์์ ์ ์์ต๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์
์ ๋น๊ฒฐ์ ์ ์ด๋ฏ๋ก ๋ฆฌ์์ค๊ฐ ์ธ์ ํด์ ๋ ์ง ์ ํํ ์ ์ ์์ต๋๋ค. ์๋ try...finally
๋ธ๋ก์ ๋ ๊ฒฐ์ ์ ์ด์ง๋ง, ํนํ ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ ๋ค๋ฃฐ ๋ ์ฅํฉํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. 'Using' ์ ์ธ์ ๋ ๊นจ๋ํ๊ณ ๊ฐ๊ฒฐํ๋ฉฐ ์ ๋ขฐํ ์ ์๋ ๋์์ ์ ๊ณตํฉ๋๋ค.
Using ์ ์ธ์ ์ด์
- ๊ฒฐ์ ์ ์ข ๋ฃ: ๋ฆฌ์์ค๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋ ์ ํํ๊ฒ ํด์ ๋์ด ๋ฆฌ์์ค ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ๋จ์ํ๋ ๋ฆฌ์์ค ๊ด๋ฆฌ:
using
์ ์ธ์ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ฌ ์ฝ๋๋ฅผ ๋ ๊นจ๋ํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. - ์์ธ ์์ ์ฑ: ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ฆฌ์์ค๊ฐ ํด์ ๋๋๋ก ๋ณด์ฅํ์ฌ ์ค๋ฅ ์๋๋ฆฌ์ค์์ ๋ฆฌ์์ค ๋์๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ํฅ์๋ ์ฝ๋ ๊ฐ๋
์ฑ:
using
์ ์ธ์ ์ด๋ค ๋ณ์๊ฐ ํด์ ํด์ผ ํ ๋ฆฌ์์ค๋ฅผ ๋ณด์ ํ๊ณ ์๋์ง ๋ช ํํ๊ฒ ๋ํ๋ ๋๋ค. - ์ค๋ฅ ์ํ ๊ฐ์: ํด์ ํ๋ก์ธ์ค๋ฅผ ์๋ํํจ์ผ๋ก์จ
using
์ ์ธ์ ๋ฆฌ์์ค ํด์ ๋ฅผ ์์ด๋ฒ๋ฆด ์ํ์ ์ค์ฌ์ค๋๋ค.
'Using' ์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ
'Using' ์ ์ธ์ ๊ตฌํํ๊ธฐ ๊ฐ๋จํฉ๋๋ค. ๋ค์์ ๊ธฐ๋ณธ์ ์ธ ์์ ์ ๋๋ค:
class MyResource {
[Symbol.dispose]() {
console.log("๋ฆฌ์์ค ํด์ ๋จ");
}
}
{
using resource = new MyResource();
console.log("๋ฆฌ์์ค ์ฌ์ฉ ์ค");
// ์ฌ๊ธฐ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค
}
// ์ถ๋ ฅ:
// ๋ฆฌ์์ค ์ฌ์ฉ ์ค
// ๋ฆฌ์์ค ํด์ ๋จ
์ด ์์ ์์ MyResource
๋ [Symbol.dispose]()
๋ฉ์๋๋ฅผ ๊ตฌํํฉ๋๋ค. using
์ ์ธ์ ๋ธ๋ก ๋ด์์ ์ค๋ฅ ๋ฐ์ ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ธ๋ก์ด ์ข
๋ฃ๋ ๋ ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
IDisposable ํจํด ๊ตฌํ
'Using' ์ ์ธ์ ์ฌ์ฉํ๋ ค๋ฉด IDisposable
ํจํด์ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฐ์ฒด๊ฐ ๋ณด์ ํ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๋ [Symbol.dispose]()
๋ฉ์๋๋ฅผ ๊ฐ์ง ํด๋์ค๋ฅผ ์ ์ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
๋ค์์ ํ์ผ ํธ๋ค์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ๋ ์์ธํ ์์ ์ ๋๋ค:
import * as fs from 'fs';
class FileHandler {
private fileDescriptor: number;
private filePath: string;
constructor(filePath: string) {
this.filePath = filePath;
this.fileDescriptor = fs.openSync(filePath, 'r+');
console.log(`ํ์ผ ์ด๋ฆผ: ${filePath}`);
}
[Symbol.dispose]() {
if (this.fileDescriptor) {
fs.closeSync(this.fileDescriptor);
console.log(`ํ์ผ ๋ซํ: ${this.filePath}`);
this.fileDescriptor = 0; // ์ด์ค ํด์ ๋ฐฉ์ง
}
}
read(buffer: Buffer, offset: number, length: number, position: number): number {
return fs.readSync(this.fileDescriptor, buffer, offset, length, position);
}
write(buffer: Buffer, offset: number, length: number, position: number): number {
return fs.writeSync(this.fileDescriptor, buffer, offset, length, position);
}
}
// ์ฌ์ฉ ์์
const filePath = 'example.txt';
fs.writeFileSync(filePath, '์๋
ํ์ธ์, ์ธ๊ณ!');
{
using file = new FileHandler(filePath);
const buffer = Buffer.alloc(13);
file.read(buffer, 0, 13, 0);
console.log(`ํ์ผ์์ ์ฝ์: ${buffer.toString()}`);
}
console.log('ํ์ผ ์์
์๋ฃ.');
fs.unlinkSync(filePath);
์ด ์์ ์์:
FileHandler
๋ ํ์ผ ํธ๋ค์ ์บก์ํํ๊ณ[Symbol.dispose]()
๋ฉ์๋๋ฅผ ๊ตฌํํฉ๋๋ค.[Symbol.dispose]()
๋ฉ์๋๋fs.closeSync()
๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ํธ๋ค์ ๋ซ์ต๋๋ค.using
์ ์ธ์ ํ์ผ ์์ ์ค ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ธ๋ก์ด ์ข ๋ฃ๋ ๋ ํ์ผ ํธ๋ค์ด ๋ซํ๋๋ก ๋ณด์ฅํฉ๋๋ค.- `using` ๋ธ๋ก์ด ์๋ฃ๋ ํ, ์ฝ์ ์ถ๋ ฅ์ ํ์ผ ํด์ ๊ฐ ๋ฐ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ค์ฒฉ๋ 'Using' ์ ์ธ
using
์ ์ธ์ ์ค์ฒฉํ์ฌ ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค:
class Resource1 {
[Symbol.dispose]() {
console.log("Resource1 ํด์ ๋จ");
}
}
class Resource2 {
[Symbol.dispose]() {
console.log("Resource2 ํด์ ๋จ");
}
}
{
using resource1 = new Resource1();
using resource2 = new Resource2();
console.log("๋ฆฌ์์ค ์ฌ์ฉ ์ค");
// ์ฌ๊ธฐ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค
}
// ์ถ๋ ฅ:
// ๋ฆฌ์์ค ์ฌ์ฉ ์ค
// Resource2 ํด์ ๋จ
// Resource1 ํด์ ๋จ
using
์ ์ธ์ ์ค์ฒฉํ ๋, ๋ฆฌ์์ค๋ ์ ์ธ๋ ์์์ ์ญ์์ผ๋ก ํด์ ๋ฉ๋๋ค.
ํด์ ์ค ์ค๋ฅ ์ฒ๋ฆฌ
ํด์ ์ค์ ๋ฐ์ํ ์ ์๋ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. using
์ ์ธ์ [Symbol.dispose]()
๊ฐ ํธ์ถ๋ ๊ฒ์ ๋ณด์ฅํ์ง๋ง, ๋ฉ์๋ ์์ฒด์์ ๋ฐ์ํ๋ ์์ธ๋ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค. [Symbol.dispose]()
๋ฉ์๋ ๋ด์์ try...catch
๋ธ๋ก์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
class RiskyResource {
[Symbol.dispose]() {
try {
// ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ ์ํํ ์์
์ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค
throw new Error("ํด์ ์คํจ!");
} catch (error) {
console.error("ํด์ ์ค ์ค๋ฅ ๋ฐ์:", error);
// ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ๊ฑฐ๋ ๋ค๋ฅธ ์ ์ ํ ์กฐ์น๋ฅผ ์ทจํฉ๋๋ค
}
}
}
{
using resource = new RiskyResource();
console.log("์ํํ ๋ฆฌ์์ค ์ฌ์ฉ ์ค");
}
// ์ถ๋ ฅ (์ค๋ฅ ์ฒ๋ฆฌ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์):
// ์ํํ ๋ฆฌ์์ค ์ฌ์ฉ ์ค
// ํด์ ์ค ์ค๋ฅ ๋ฐ์: [Error: ํด์ ์คํจ!]
์ด ์์ ์์ [Symbol.dispose]()
๋ฉ์๋๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค. ๋ฉ์๋ ๋ด์ try...catch
๋ธ๋ก์ ์ค๋ฅ๋ฅผ ์ก์ ์ฝ์์ ๊ธฐ๋กํ์ฌ ์ค๋ฅ๊ฐ ์ ํ๋์ด ์ ํ๋ฆฌ์ผ์ด์
์ด ์ถฉ๋ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
'Using' ์ ์ธ์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก
'Using' ์ ์ธ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์๋์ผ๋ก ๊ด๋ฆฌํ์ง ์๋ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ ์๋๋ฆฌ์ค์์ ํนํ ์ ์ฉํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ์ผ ํธ๋ค: ์ ์์ ์์ ๋ณด์ฌ์ค ๊ฒ์ฒ๋ผ 'using' ์ ์ธ์ ํ์ผ ํธ๋ค์ด ์ ์ํ๊ฒ ๋ซํ๋๋ก ๋ณด์ฅํ์ฌ ํ์ผ ์์ ๋ฐ ๋ฆฌ์์ค ๋์๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ๋คํธ์ํฌ ์ฐ๊ฒฐ: 'Using' ์ ์ธ์ ๋ ์ด์ ํ์ํ์ง ์์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ๋ซ๋ ๋ฐ ์ฌ์ฉ๋์ด ๋คํธ์ํฌ ๋ฆฌ์์ค๋ฅผ ํ๋ณดํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ: 'Using' ์ ์ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๋ซ๋ ๋ฐ ์ฌ์ฉ๋์ด ์ฐ๊ฒฐ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์คํธ๋ฆผ: ์ ์ถ๋ ฅ ์คํธ๋ฆผ์ ๊ด๋ฆฌํ๊ณ ๋ฐ์ดํฐ ์์ค์ด๋ ์์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ ํ ๋ซํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ๋ง์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ช ์์ ์ผ๋ก ํด์ ํด์ผ ํ๋ ๋ฆฌ์์ค๋ฅผ ํ ๋นํฉ๋๋ค. 'Using' ์ ์ธ์ ์ด๋ฌํ ๋ฆฌ์์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ทธ๋ํฝ API, ํ๋์จ์ด ์ธํฐํ์ด์ค ๋๋ ํน์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ์ํธ ์์ฉํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
'Using' ์ ์ธ๊ณผ ์ ํต์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ ๊ธฐ๋ฒ ๋น๊ต
'using' ์ ์ธ์ ๋ช ๊ฐ์ง ์ ํต์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ ๊ธฐ๋ฒ๊ณผ ๋น๊ตํด ๋ณด๊ฒ ์ต๋๋ค:
๊ฐ๋น์ง ์ปฌ๋ ์
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์คํ ์ด ํ์ํ๋ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ํ ํํ์ ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ์ง๋ง ๋น๊ฒฐ์ ์ ์ ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์ธ์ ์คํ๋์ด ๋ฆฌ์์ค๋ฅผ ํด์ ํ ์ง ์ ํํ ์ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๋ฆฌ์์ค๊ฐ ๋๋ฌด ์ค๋ ์ ์ง๋๋ฉด ๋ฆฌ์์ค ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ํ, ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ฃผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ ํ์ผ ํธ๋ค์ด๋ ๋คํธ์ํฌ ์ฐ๊ฒฐ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ ํ์ ๋ฆฌ์์ค๋ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค.
Try...Finally ๋ธ๋ก
try...finally
๋ธ๋ก์ ์์ธ ๋ฐ์ ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ฝ๋๋ฅผ ์คํํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์ ์ ๋ฐ ์์ธ ์๋๋ฆฌ์ค ๋ชจ๋์์ ๋ฆฌ์์ค๊ฐ ํด์ ๋๋๋ก ๋ณด์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ try...finally
๋ธ๋ก์ ํนํ ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ ๋ค๋ฃฐ ๋ ์ฅํฉํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. finally
๋ธ๋ก์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋์๋์ง, ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ์ ์ ํ๊ฒ ํด์ ๋์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ๋ํ, ์ค์ฒฉ๋ `try...finally` ๋ธ๋ก์ ๋น ๋ฅด๊ฒ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
์๋ ํด์
`dispose()` ๋๋ ๋๋ฑํ ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ํธ์ถํ๋ ๊ฒ์ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ ํด์ ๋ฉ์๋๊ฐ ์ ์ ํ ์์ ์ ํธ์ถ๋๋๋ก ์ธ์ฌํ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. ํด์ ๋ฉ์๋ ํธ์ถ์ ์๊ธฐ ์ฌ์ ๋ฆฌ์์ค ๋์๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ํ ์๋ ํด์ ๋ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋ฆฌ์์ค๊ฐ ํด์ ๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.
๋ฐ๋ฉด์ 'using' ์ ์ธ์ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ๋ ๊ฒฐ์ ์ ์ด๊ณ ๊ฐ๊ฒฐํ๋ฉฐ ์ ๋ขฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ฆฌ์์ค๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋ ํด์ ๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค. ๋ํ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ด๊ณ ์ฝ๋ ๊ฐ๋ ์ฑ์ ํฅ์์ํต๋๋ค.
๊ณ ๊ธ 'Using' ์ ์ธ ์๋๋ฆฌ์ค
๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ ์ธ์๋ 'using' ์ ์ธ์ ๋ฆฌ์์ค ๊ด๋ฆฌ ์ ๋ต์ ๊ฐํํ๊ธฐ ์ํด ๋ ๋ณต์กํ ์๋๋ฆฌ์ค์์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์กฐ๊ฑด๋ถ ํด์
๋๋ก๋ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฆฌ์์ค๋ฅผ ์กฐ๊ฑด๋ถ๋ก ํด์ ํ๊ณ ์ถ์ ์ ์์ต๋๋ค. ์ด๋ [Symbol.dispose]()
๋ฉ์๋ ๋ด์ ํด์ ๋ก์ง์ if
๋ฌธ์ผ๋ก ๊ฐ์ธ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
class ConditionalResource {
private shouldDispose: boolean;
constructor(shouldDispose: boolean) {
this.shouldDispose = shouldDispose;
}
[Symbol.dispose]() {
if (this.shouldDispose) {
console.log("์กฐ๊ฑด๋ถ ๋ฆฌ์์ค ํด์ ๋จ");
}
else {
console.log("์กฐ๊ฑด๋ถ ๋ฆฌ์์ค ํด์ ๋์ง ์์");
}
}
}
{
using resource1 = new ConditionalResource(true);
using resource2 = new ConditionalResource(false);
}
// ์ถ๋ ฅ:
// ์กฐ๊ฑด๋ถ ๋ฆฌ์์ค ํด์ ๋จ
// ์กฐ๊ฑด๋ถ ๋ฆฌ์์ค ํด์ ๋์ง ์์
๋น๋๊ธฐ ํด์
'Using' ์ ์ธ์ ๋ณธ์ง์ ์ผ๋ก ๋๊ธฐ์ ์ด์ง๋ง, ํด์ ์ค์ ๋น๋๊ธฐ ์์
์ ์ํํด์ผ ํ๋ ์๋๋ฆฌ์ค(์: ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ซ๋ ๊ฒฝ์ฐ)์ ์ง๋ฉดํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ํ์ค [Symbol.dispose]()
๋ฉ์๋๋ ๋๊ธฐ์์ด๋ฏ๋ก ์ฝ๊ฐ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํฉ๋๋ค. ํ์ค 'using' ๊ตฌ๋ฌธ ์ธ๋ถ์์ Promise๋ async/await๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋น๋๊ธฐ ํด์ ๋ฅผ ์ํ ๋์ฒด `Symbol`์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ํผ๋ ๋์ฒด ํจํด์ ๊ณ ๋ คํด ๋ณด์ธ์.
๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํตํฉ
IDisposable
ํจํด์ ์ง์ ์ง์ํ์ง ์๋ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์
ํ ๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฆฌ์์ค๋ฅผ ๋ํํ๊ณ [Symbol.dispose]()
๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ์ด๋ํฐ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ 'using' ์ ์ธ๊ณผ ์ํํ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
'Using' ์ ์ธ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
'Using' ์ ์ธ์ ์ด์ ์ ๊ทน๋ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค:
- IDisposable ํจํด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๊ธฐ: ํด๋์ค๊ฐ
IDisposable
ํจํด์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๊ณ ,[Symbol.dispose]()
๋ฉ์๋์์ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ ์ ํ๊ฒ ํด์ ํ๋์ง ํ์ธํ์ญ์์ค. - ํด์ ์ค ์ค๋ฅ ์ฒ๋ฆฌํ๊ธฐ:
[Symbol.dispose]()
๋ฉ์๋ ๋ด์์try...catch
๋ธ๋ก์ ์ฌ์ฉํ์ฌ ํด์ ์ค ๋ฐ์ํ ์ ์๋ ์ ์ฌ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ์ญ์์ค. - "using" ๋ธ๋ก์์ ์์ธ ๋์ง์ง ์๊ธฐ: 'using' ์ ์ธ์ด ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋๋ผ๋, ์์ธ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๊ณ ์์์น ๋ชปํ๊ฒ ๋์ง์ง ์๋ ๊ฒ์ด ๋ ์ข์ ๊ดํ์ ๋๋ค.
- 'Using' ์ ์ธ ์ผ๊ด๋๊ฒ ์ฌ์ฉํ๊ธฐ: ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ด๋ฆฌ๋๋๋ก ์ฝ๋ ์ ์ฒด์์ 'using' ์ ์ธ์ ์ผ๊ด๋๊ฒ ์ฌ์ฉํ์ญ์์ค.
- ํด์ ๋ก์ง ๋จ์ํ๊ฒ ์ ์งํ๊ธฐ:
[Symbol.dispose]()
๋ฉ์๋์ ํด์ ๋ก์ง์ ๊ฐ๋ฅํ ํ ๊ฐ๋จํ๊ณ ๋ช ๋ฃํ๊ฒ ์ ์งํ์ญ์์ค. ์ ์ฌ์ ์ผ๋ก ์คํจํ ์ ์๋ ๋ณต์กํ ์์ ์ ํผํ์ญ์์ค. - ๋ฆฐํฐ ์ฌ์ฉ ๊ณ ๋ คํ๊ธฐ: ๋ฆฐํฐ๋ฅผ ์ฌ์ฉํ์ฌ 'using' ์ ์ธ์ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ์ ๊ฐ์ ํ๊ณ ์ ์ฌ์ ์ธ ๋ฆฌ์์ค ๋์๋ฅผ ๊ฐ์งํ์ญ์์ค.
TypeScript์ ๋ฆฌ์์ค ๊ด๋ฆฌ์ ๋ฏธ๋
TypeScript์ 'using' ์ ์ธ์ด ๋์ ๋ ๊ฒ์ ๋ฆฌ์์ค ๊ด๋ฆฌ์์ ์ค์ํ ์ง์ ์ ์๋ฏธํฉ๋๋ค. TypeScript๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ด ๋ถ์ผ์์ ๋ ๋ง์ ๊ฐ์ ์ ๊ธฐ๋ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, TypeScript์ ํฅํ ๋ฒ์ ์์๋ ๋น๋๊ธฐ ํด์ ๋ ๋ ์ ๊ตํ ๋ฆฌ์์ค ๊ด๋ฆฌ ํจํด์ ๋ํ ์ง์์ด ๋์ ๋ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
'Using' ์ ์ธ์ TypeScript์์ ๊ฒฐ์ ์ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ ํต์ ์ธ ๊ธฐ๋ฒ์ ๋นํด ๋ ๊นจ๋ํ๊ณ ๊ฐ๊ฒฐํ๋ฉฐ ์ ๋ขฐํ ์ ์๋ ๋ฆฌ์์ค ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. 'Using' ์ ์ธ์ ์ฌ์ฉํจ์ผ๋ก์จ TypeScript ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฌ๊ณ ์ฑ, ์ฑ๋ฅ ๋ฐ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด ํ๋์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ ์ ๊ทผ ๋ฐฉ์์ ์ฑํํ๋ฉด ์์ฌํ ์ฌ์ง ์์ด ๋ ํจ์จ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ๊ดํ์ผ๋ก ์ด์ด์ง ๊ฒ์ ๋๋ค.
IDisposable
ํจํด์ ๊ตฌํํ๊ณ using
ํค์๋๋ฅผ ํ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ฆฌ์์ค๊ฐ ๊ฒฐ์ ์ ์ผ๋ก ํด์ ๋๋๋ก ๋ณด์ฅํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์ ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. using
์ ์ธ์ TypeScript์ ํ์
์์คํ
๊ณผ ์ํํ๊ฒ ํตํฉ๋๋ฉฐ ๋ค์ํ ์๋๋ฆฌ์ค์์ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ๊นจ๋ํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. TypeScript ์ํ๊ณ๊ฐ ๊ณ์ ์ฑ์ฅํจ์ ๋ฐ๋ผ 'using' ์ ์ธ์ ๊ฐ๋ ฅํ๊ณ ์ ๋ขฐํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๋ฐ ์ ์ ๋ ์ค์ํ ์ญํ ์ ํ ๊ฒ์
๋๋ค.